﻿Функция ПодготовитьОтвет(Результат)
	
	Возврат Новый Структура("success, result, error", Результат["Успех"], Результат["Результат"], Результат["Ошибка"]);
	
КонецФункции


#Область Обработчики


Функция _CheckStatus_(ПараметрыЗапроса)
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	Результат["Успех"] = Истина;
	
	Возврат Результат;
	
КонецФункции

Функция GetMenu(ПараметрыЗапроса)
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	ДатаМеню = ПараметрыЗапроса["date"];
	Токен = ПараметрыЗапроса["token"];
	
	Если ДатаМеню = Неопределено Тогда
		ДатаМеню = ТекущаяДата();
	Иначе
		ДатаМеню = ПрочитатьДатуJSON(ДатаМеню, ФорматДатыJSON.ISO)
	КонецЕсли;
	
	Возврат API.ПолучитьМеню(ДатаМеню, Токен);
	
КонецФункции

Функция Auth(ПараметрыЗапроса)
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	Логин = ПараметрыЗапроса["login"];
	Пароль = ПараметрыЗапроса["password"];
	
	Если Логин = Неопределено Тогда
		Результат["Ошибка"] = "Параметр ""login"" не найден!";
	ИначеЕсли Пароль = Неопределено Тогда
		Результат["Ошибка"] = "Параметр ""password"" не найден!";
	Иначе
		Результат = API.Авторизация(Логин, Пароль);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция AuthCheck(ПараметрыЗапроса)
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	Токен = ПараметрыЗапроса["token"];
	
	Если Токен = Неопределено Тогда
		Результат["Ошибка"] = "Поле ""token"" не найдено!"; 
	Иначе
		Результат = API.ПроверитьАвторизацию(Токен);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция Register(ПараметрыЗапроса)
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	Логин = ПараметрыЗапроса["login"];
	Пароль = ПараметрыЗапроса["password"];
	
	Если Логин = Неопределено Тогда
		Результат["Ошибка"] = "Поле ""login"" не найдено!";
	ИначеЕсли Пароль = Неопределено Тогда
		Результат["Ошибка"] = "Поле ""password"" не найдено!";
	Иначе
		Результат = API.Регистрация(Логин, Пароль);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция GetDishInfo(ПараметрыЗапроса)

	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	ИдентификаторБлюда = ПараметрыЗапроса["id"];
	
	Если ИдентификаторБлюда = Неопределено Тогда
		Результат["Ошибка"] = "Параметр ""id"" не найден!";
	Иначе
		Результат = API.ПолучитьИнформациюБлюда(ИдентификаторБлюда, ПараметрыЗапроса["token"]);
	КонецЕсли;
	
	Возврат Результат;	
	
КонецФункции

Функция CartRead(ПараметрыЗапроса)
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	РезультатПроверкиАвторизации = AuthCheck(ПараметрыЗапроса);
	
	Если РезультатПроверкиАвторизации["Успех"] Тогда
		Результат = API.ПолучитьСоставКорзины(ПараметрыЗапроса["token"]);
	Иначе
		Результат["Ошибка"] = РезультатПроверкиАвторизации["Ошибка"];
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция CartWrite(ПараметрыЗапроса)
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	РезультатПроверкиАвторизации = AuthCheck(ПараметрыЗапроса);
	
	Если РезультатПроверкиАвторизации["Успех"] Тогда
		Результат = API.ЗаписатьСоставКорзины(ПараметрыЗапроса["token"], ПараметрыЗапроса["dishes"]);
	Иначе
		Результат["Ошибка"] = РезультатПроверкиАвторизации["Ошибка"];
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция OrderRead(ПараметрыЗапроса)

	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	РезультатПроверкиАвторизации = AuthCheck(ПараметрыЗапроса);
	
	Если РезультатПроверкиАвторизации["Успех"] Тогда
		Результат = API.ПолучитьДанныеЗаказа(ПараметрыЗапроса["token"], ПараметрыЗапроса["id"]);
	Иначе
		Результат["Ошибка"] = РезультатПроверкиАвторизации["Ошибка"];
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция OrderWrite(ПараметрыЗапроса)

	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	РезультатПроверкиАвторизации = AuthCheck(ПараметрыЗапроса);
	
	Если РезультатПроверкиАвторизации["Успех"] Тогда
		Результат = API.ЗапистьДанныеЗаказа(ПараметрыЗапроса["token"]);
	Иначе
		Результат["Ошибка"] = РезультатПроверкиАвторизации["Ошибка"];
	КонецЕсли;
	
	Возврат Результат;	
	
КонецФункции

Функция OrderEdit(ПараметрыЗапроса)
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	РезультатПроверкиАвторизации = AuthCheck(ПараметрыЗапроса);
	
	Если РезультатПроверкиАвторизации["Успех"] Тогда
		Результат = API.РедактироватьДанныеЗаказа(ПараметрыЗапроса["token"], ПараметрыЗапроса["id"]);
	Иначе
		Результат["Ошибка"] = РезультатПроверкиАвторизации["Ошибка"];
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция OrderList(ПараметрыЗапроса)
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	РезультатПроверкиАвторизации = AuthCheck(ПараметрыЗапроса);
	
	Если РезультатПроверкиАвторизации["Успех"] Тогда
		Результат = API.ПолучитьСписокПоследнихЗаказов(ПараметрыЗапроса["token"]);
	Иначе
		Результат["Ошибка"] = РезультатПроверкиАвторизации["Ошибка"];
	КонецЕсли;
	
	Возврат Результат;	
	
КонецФункции

Функция ProfileEdit(ПараметрыЗапроса)
	
КонецФункции

Функция ProfileStat(ПараметрыЗапроса)
	
КонецФункции	

Функция MedsList(ПараметрыЗапроса)
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	МассивТипов = ПараметрыЗапроса["types"];
	
	Если МассивТипов = Неопределено Тогда
		Результат["Ошибка"] = "Поле ""types"" не найдено!";
	Иначе
		Результат = API.ПолучитьНаборМедицинскихСведений(МассивТипов);
	КонецЕсли;
	
	Возврат Результат;	
	
КонецФункции

Функция ProfileMedsWrite(ПараметрыЗапроса)
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	РезультатПроверкиАвторизации = AuthCheck(ПараметрыЗапроса);
	
	Если РезультатПроверкиАвторизации["Успех"] Тогда
		Результат = API.ЗаписатьМедицинуПользователя(ПараметрыЗапроса["token"], ПараметрыЗапроса["meds"]);
	Иначе
		Результат["Ошибка"] = РезультатПроверкиАвторизации["Ошибка"];
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция ProfileMedsRead(ПараметрыЗапроса)
	
	Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
	
	РезультатПроверкиАвторизации = AuthCheck(ПараметрыЗапроса);
	
	Если РезультатПроверкиАвторизации["Успех"] Тогда
		Результат = API.ПрочитатьМедицинуПользователя(ПараметрыЗапроса["token"]);
	Иначе
		Результат["Ошибка"] = РезультатПроверкиАвторизации["Ошибка"];
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции


#КонецОбласти


Функция ProcessRequest(Запрос)
	
	#Если Сервер И Не Сервер Тогда
		Запрос = Новый HTTPСервисЗапрос;
	#КонецЕсли
	
	// обрабатываем preflight запрос для обработки CORS
	ОбработатьТелоЗапроса = Истина;
	Если Запрос.HTTPМетод = "OPTIONS" Тогда
		ОбработатьТелоЗапроса = Ложь;
	КонецЕсли;
	
	Ответ = Новый HTTPСервисОтвет(200);
	
	// перебираем шаблоны сервиса
	РесурсыШаблонов = Новый Соответствие;
	Для Каждого ШаблонСервиса Из Метаданные.HTTPСервисы.API.ШаблоныURL Цикл
		РесурсыШаблонов.Вставить(ШаблонСервиса.Шаблон, ШаблонСервиса.Имя);
	КонецЦикла;
	
	// берем обработчик (имя шаблона = имя функции в этом же модуле)
	Обработчик = РесурсыШаблонов[Запрос.ОтносительныйURL];
	
	Если Обработчик = Неопределено Тогда
		// если обработчик отсутствует - жалуемся
		Ответ.КодСостояния = 404;
	Иначе
		Результат = Новый Структура("Успех, Результат, Ошибка", Ложь, Неопределено, "");
		
		Если ОбработатьТелоЗапроса Тогда
			Попытка
				// пытаемся определить что от нас хотят
				JSONСтрокой = Запрос.ПолучитьТелоКакСтроку();
				
				Если JSONСтрокой = "" Тогда
					JSONКоллекцией = Неопределено;
				Иначе
					JSONКоллекцией = ОбщийМодуль.ТекстВКоллекцию_JSON(JSONСтрокой);
				КонецЕсли;
				
				// обрабатываем запрос
				Выполнить СтрШаблон("Результат = %1(JSONКоллекцией);", Обработчик);
			Исключение
				// что-то пошло не так, раскаиваемся
				Ответ.КодСостояния = 500;
				
				Результат["Ошибка"] = ОписаниеОшибки();
			КонецПопытки;
			
			Если Результат.Свойство("КодСостояния") Тогда
				Ответ.КодСостояния = Результат["КодСостояния"];
				Результат.Удалить("КодСостояния");
				
			ИначеЕсли Не Результат["Успех"] Тогда
				Ответ.КодСостояния = 400;
			КонецЕсли;
			
			// пытаемся сериализовать ответ
			Попытка
				JSONСтрокой = ОбщийМодуль.КоллекциюВТекст_JSON(ПодготовитьОтвет(Результат));
			Исключение
				// не удалось, выдаем ответ о внутренней ошибке
				Ответ.КодСостояния = 500;
				
				JSONСтрокой = СтрШаблон("	{
											|	""success"": false,
											|	""result"": null,
											|	""error"": ""%1""
											|}", ОписаниеОшибки());
			КонецПопытки;
			
		КонецЕсли;
		
		Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
		
		// пшлнхй этот ваш CORS
		Ответ.Заголовки.Вставить("Access-Control-Allow-Headers", "*");
		Ответ.Заголовки.Вставить("Access-Control-Allow-Methods", "*");
		Ответ.Заголовки.Вставить("Access-Control-Allow-Origin", "*");
		
		Ответ.УстановитьТелоИзСтроки(JSONСтрокой, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	КонецЕсли;
	
	Возврат Ответ;
	
КонецФункции

Функция GetImage(Запрос)
	
	#Если Сервер И Не Сервер Тогда
		Запрос = Новый HTTPСервисЗапрос;
	#КонецЕсли
	
	Ответ = Новый HTTPСервисОтвет(200);
	
	Если Запрос.HTTPМетод = "OPTIONS" Тогда
		Ответ.Заголовки.Вставить("Access-Control-Allow-Headers", "*");
		Ответ.Заголовки.Вставить("Access-Control-Allow-Methods", "*");
		Ответ.Заголовки.Вставить("Access-Control-Allow-Origin", "*");
	Иначе
		ИдентификаторБлюда = Запрос.ПараметрыURL["uuid"];
		
		ДвоичныеДанныеИзображения = API.ПолучитьИзображение(ИдентификаторБлюда);
		
		Если ДвоичныеДанныеИзображения = Неопределено Тогда
			Ответ.КодСостояния = 404;
		Иначе
			Ответ.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеИзображения);
			Ответ.Заголовки.Вставить("Content-Type", "image/jpeg");
		КонецЕсли;
	КонецЕсли;
	
	Возврат Ответ;
	
КонецФункции
